Spring Security
์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ๋ญ์ผ?
์คํ๋ง ์ํ๋ฆฌํฐ๋ ์ธ์ฆ (Authentication), ๊ถํ(Authorize) ๋ถ์ฌ ๋ฐ ๋ณดํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ค.
Java / Java EE ํ๋ ์์ํฌ
๊ฐ๋ฐ์ ํ๋ฉด์ ๋ณด์ ๋ถ์ผ๋ ์๊ฐ์ด ๋ง์ด ์์๋๋ ํ๋๋ค ์ค ํ๋๋ค. Spring Security๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ง์ฌ์ง ๋ด๋ถ ๋ก์ง์ ํตํด ์ธ์ฆ, ๊ถํ ํ์ธ์ ํ์ํ ๊ธฐ๋ฅ๊ณผ ์ต์ ๋ค์ ์ ๊ณตํ๋ค.
์ธ์ฆ(Authentication), ์ธ๊ฐ(Authorization)
์ธ์ฆ๊ณผ ์ธ๊ฐ๋ ๋ฌด์์ผ๊น? ๋ณดํต ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น ํ ์ธ๊ฐ ์ ์ฐจ๋ฅผ ์งํํ๋ค.
- ์ธ์ฆ : ํด๋น ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ด ๋ง๋์ง๋ฅผ ํ์ธํ๋ ์ ์ฐจ.
- ์ธ๊ฐ : ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญ๋ ์์์ ์ ๊ทผ๊ฐ๋ฅํ๊ฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฐจ
์ธ์ฆ ๋ฐฉ์
- Credential ๋ฐฉ์ : username, password๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์
- ์ด์ค ์ธ์ฆ(Twofactor ์ธ์ฆ) : ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์ธ์ฆ ํ, ๋ค๋ฅธ ์ธ์ฆ ์ฒด๊ณ(์: ๋ฌผ๋ฆฌ์ ์ธ ์นด๋)๋ฅผ ์ด์ฉํ์ฌ ๋ ๊ฐ์ง์ ์กฐํฉ์ผ๋ก ์ธ์ฆํ๋ ๋ฐฉ์์ด๋ค.
- ํ๋์จ์ด ์ธ์ฆ : ์๋์ฐจ ํค์ ๊ฐ์ ๋ฐฉ์
์ด์ค Spring Security๋ Credential ๊ธฐ๋ฐ์ ์ธ์ฆ์ ์ทจํฉ๋๋ค.
- Principal : ์์ด๋ (username)
- Credential : ๋น๋ฐ๋ฒํธ (password)
ํน์ ์์์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด์๋ ๊ถํ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
ํน์ ๊ถํ์ ์ป๊ธฐ ์ํด์ ์ ์ ๋ ์ธ์ฆ์ ๋ณด(Authentication)๊ฐ ํ์ํ๊ณ ๊ด๋ฆฌ์๋ ํด๋น ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด ๊ถํ์ ์ธ๊ฐ(Authorization) ํฉ๋๋ค.
๋ณดํธ์ ์ผ๋ก username - password ํจํด์ ์ธ์ฆ๋ฐฉ์์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์ํ๋ฆฌํฐ๋ principal - credential ํจํด์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Spring Security์ ํน์ง
- Filter๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
- Spring MVC์ ๋ถ๋ฆฌ๋์ด ๊ด๋ฆฌํ๊ณ ๋์ํ ์ ์๋ค.
- Bean์ผ๋ก ์ค์ ํ ์ ์๋ค.
- Spring security 3.2๋ถํฐ๋ XML ์ค์ ์ ํ์ง ์์๋ ๋๋ค.
์คํ๋ง ์ํ๋ฆฌํฐ ์ํคํ ์ฒ Spring Security Architecture
- Http ์์ฒญ :
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช (์: ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ)์ ํฌํจํ๋ HTTP ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด ์์ฒญ์ ์ธ์ฆ ํํฐ(Authentication Filter)๋ก ์ ๋ฌ๋ฉ๋๋ค.
- AuthenticationFilter ์ธ์ฆ ํํฐ :
- ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ์๊ฒฉ ์ฆ๋ช ์ ์ถ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ผ๋ฐ์ ์ผ๋ก UsernamePasswordAuthenticationToken๊ณผ ๊ฐ์ Authentication ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- AuthenticationManager ์ธ์ฆ ๊ด๋ฆฌ์ :
- ์ธ์ฆ ํํฐ๋ AuthenticationManger ์ธํฐํ์ด์ค๋ฅผ ํธ์ถํฉ๋๋ค. AuthenticationManager๋ ์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ AuthenticationProvider์๊ฒ ์์ํ๋ ์กฐ์ ์ ์ญํ ์ ํฉ๋๋ค.
- AuthenticationProvider ์ธ์ฆ ์ ๊ณต์ :
- ์ธ์ฆ ๊ด๋ฆฌ์ ์ธ์ฆ ์์ฒญ์ ์ฌ๋ฌ AuthenticationProvider ์ธ์คํด์ค์ ์์ํฉ๋๋ค. ๊ฐ ์ ๊ณต์๋ ์ค์ ์ธ์ฆ ๋ก์ง์ ์ํํฉ๋๋ค. (์: ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธ)
- UserDetailsService :
- DaoAuthenticationProvider์ ๊ฐ์ ์ธ์ฆ ์ ๊ณต์ ์ค ํ๋๋ UserDetailsService๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. UserDetailsService๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋ค๋ฅธ ์๊ตฌ ์ ์ฅ์์์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ฉฐ, ๋ณดํต UserDetails ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- UserDetails ์ธํฐํ์ด์ค :
- UserDetails ์ธํฐํ์ด์ค๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด๋ User ๊ฐ์ฒด์ ์ํด ๊ตฌํ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ์ฉ์ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ์ญํ (๊ถํ)์ด ํฌํจ๋ฉ๋๋ค.
- ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ์ ๋ก๋ :
- UserDetailsService๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ก์ง์ ๊ตฌํ๋ ํ๊ณ , ์ฌ์ฉ์๋ฅผ ๋ํ๋ด๋ UserDetails ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- AuthenticationProvider ์ธ์ฆ ์ ๊ณต์ :
- ์ฌ์ฉ์์ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ฉด ์ธ์ฆ ์ ๊ณต์๋ ์๊ฒฉ ์ฆ๋ช ์ด ์ ํจํ์ง ํ์ ํฉ๋๋ค(์: ๋น๋ฐ๋ฒํธ๋ฅผ ๋น๊ต). ์ ํจํ๋ค๋ฉด ์ธ์ฆ์ด ์ฑ๊ณตํฉ๋๋ค.
- ์ฑ๊ณต / ์คํจ :
- ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด ์ธ์ฆ ๊ด๋ฆฌ์๋ ์ธ์ฆ๋ Authentication ๊ฐ์ฒด๋ฅผ AuthenticationFilter๋ก ๋ฐํํฉ๋๋ค. ์๊ฒฉ ์ฆ๋ช ์ด ์ ํจํ์ง ์์ผ๋ฉด AuthenticationException์ด ๋ฐ์ํฉ๋๋ค.
- SecurityContextHolder :
- ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด ์ธ์ฆ๋ Authentication ๊ฐ์ฒด๋ SecurityContextHolder์ ์ ์ฅ๋ฉ๋๋ค. SecurityContextHolder๋ ํ์ฌ ์์ฒญ์ ๋ํ Authentication ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ SecurityContext๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ ํฌํผ ํด๋์ค์ ๋๋ค.
์ด ์ํคํ ์ฒ๋ Spring Security๊ฐ ์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ค๋ช ํ๋ฉฐ, HTTP ์์ฒญ์์ ์์ํด ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๋ค์ํ ๊ตฌ์ฑ ์์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์นฉ๋๋ค.